package cn.cscb.mms.server.config;

import cn.cscb.mms.common.json.JacksonObjectMapper;
import cn.cscb.mms.server.interceptor.JwtAuthInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.List;

/**
 * 配置类，注册web层相关组件
 *
 * @author Gao Yipeng
 */
@Slf4j
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    /**
     * 拓展Spring MVC框架的消息转换器
     *
     * @param converters 消息转换器
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器");
        // 创建一个消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 需要为消息转换器设置一个对象转换器
        converter.setObjectMapper(new JacksonObjectMapper());
        // 将自定义消息转换器加入容器中
        converters.add(0, converter);
    }

    /**
     * 跨域设置
     *
     * @param registry 跨域注册表
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 允许跨域访问的路径
        registry.addMapping("/**")
                // 允许跨域访问的源
                .allowedOrigins("*")
                // 允许请求的方法
                .allowedMethods("*")
                // 允许头部设置
                .allowedHeaders("*")
                // 预检请求的缓存时间（秒）
                .maxAge(3600);
    }

    @Resource
    private JwtAuthInterceptor jwtAuthInterceptor;

    /**
     * 自定义拦截器
     *
     * @param registry 拦截器列表
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        log.info("开始注册自定义拦截器");
        registry.addInterceptor(jwtAuthInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login")
                .excludePathPatterns("/taskInfo/export");
    }
}
